home *** CD-ROM | disk | FTP | other *** search
/ Disc to the Future 2 / Disc to the Future Part II Programmer's Reference (Wayzata Technology)(6013)(1992).bin / MAC / THINKC / 3_0 / COLOR_OV / COLOROVA.C < prev   
C/C++ Source or Header  |  1989-04-14  |  4KB  |  156 lines

  1. /*
  2.  * ColorOvals
  3.  *
  4.  *    An example of how to write a simple color program
  5.  *    that will work on all Macs, with all ROMS, versions
  6.  *    of system software, etc.  This program uses classic
  7.  *    Quickdraw's colors, so it doesn't check for any
  8.  *    particular configuration.
  9.  *
  10.  *    Brian Bechtel.  Public domain.
  11.  *
  12.  */
  13.  
  14.  
  15. #include <QuickDraw.h>
  16. #include <EventMgr.h>
  17. #include <OSUtil.h>
  18. #include <WindowMgr.h>
  19.  
  20. #define BOXOVERLAP    20
  21.  
  22. Str255    about = "\pColorOvals by Brian Bechtel";
  23.  
  24. /*
  25.  * Return a pseudo random integer, using the
  26.  * Mac OSUtility function Random()
  27.  */
  28. int
  29. randomize(x)
  30. int x;
  31. {
  32.     int    x2 = Random() % x;
  33.     
  34.     if (x2 < 0) x2 = -x2;
  35.     return(x2);
  36.     
  37. }
  38.  
  39. main()
  40. {
  41.     WindowPtr    w;
  42.     Rect        rct;
  43.     int            i, j, l, t, r, b;
  44.     int            bottom, right;
  45.  
  46. /*
  47.  * You have to initialize the GrafPort, and Windows, 
  48.  * and you might as well do the cursor so you get an
  49.  * arrow instead of a watch.
  50.  */
  51.     InitGraf(&thePort);
  52.     InitWindows();
  53.     InitCursor();
  54. /*
  55.  * Set the seed so that we see different displays each time
  56.  * we run.
  57.  */
  58.      GetDateTime(&randSeed);
  59.  
  60. /*
  61.  * I'm going to be using these two values a lot, so I
  62.  * store them in local storage.
  63.  */
  64.     bottom = screenBits.bounds.bottom;
  65.     right = screenBits.bounds.right;
  66.  
  67. /*
  68.  * Build a window the size of the screen.
  69.  */
  70.     SetRect(&rct, 0, 0, right, bottom);
  71.     w = NewWindow(0L, &rct, "\pno title", true, plainDBox, 
  72.         (WindowPtr *)-1, true, 0L);
  73.     SetPort(w);
  74.  
  75. /*
  76.  * Calling InitPort for this port (remember, a WindowPtr 
  77.  * contains within it a GrafPort as the first elements)
  78.  * means that I will cover the menubar, as well as the 
  79.  * rest of the screen. Set background pattern to the 
  80.  * default black and erase the screen.
  81.  */
  82.     InitPort(w);
  83.     BackPat(w->pnPat);
  84.     EraseRect(&(w->portRect));
  85.  
  86. /*
  87.  * Loop until the user hits the mouse button, building
  88.  * a random sized rectangle.  About half the time, we
  89.  * set a new foreground color, and paint a new oval.
  90.  * About half the time, we invert the oval contained in
  91.  * this random rectangle.
  92.  */
  93.     do {
  94.         l = randomize(right);
  95.         t = randomize(bottom);
  96.         r = randomize(right);
  97.         b = randomize(bottom);
  98.         SetRect(&rct, l, t, r, b);
  99.         i = randomize(20);
  100.         if (i < 10) {
  101.             switch (i) {
  102.                 case 1:    ForeColor(whiteColor); break;
  103.                 case 2:    ForeColor(redColor); break;
  104.                 case 3:    ForeColor(greenColor); break;
  105.                 case 4:    ForeColor(blueColor); break;
  106.                 case 5:    ForeColor(cyanColor); break;
  107.                 case 6:    ForeColor(magentaColor); break;
  108.                 case 7: ForeColor(yellowColor); break;
  109.                 default: ForeColor(blackColor); break;
  110.             }
  111.             j = randomize(4);
  112.             switch (j) {
  113.                 case 0:    FillOval(&rct, black); break;
  114.                 case 1:    FillOval(&rct, gray); break;
  115.                 case 2:    FillOval(&rct, ltGray); break;
  116.                 case 3:    FillOval(&rct, dkGray); break;
  117.             }
  118.         }
  119.         else
  120.             InvertOval(&rct);
  121.         SystemTask();    /* let background stuff happen,
  122.                             since we may be in this loop
  123.                             a while.
  124.                          */
  125.     } while (!Button());
  126.  
  127. /*
  128.  * Okay, the user hit the button.  Wait for them to let up
  129.  * on the button (otherwise, we'd read the button too fast
  130.  * and exit before we show them who we are.
  131.  */
  132.     while (Button()) {};
  133.     FlushEvents(everyEvent, 0);
  134.  
  135. /*
  136.  * Build a black rectangle and write a white string into it
  137.  * to show the user who we are.  I could try to find the font
  138.  * height (using GetFontInfo()), but I'm just approximating
  139.  * everything by a constant of BOXOVERLAP.
  140.  */
  141.     ForeColor(blackColor);
  142.     l = (right-StringWidth(about))/2;
  143.     t = bottom/2;
  144.     MoveTo(l, t);
  145.     r = l+StringWidth(about)+BOXOVERLAP;
  146.     b = t+BOXOVERLAP;
  147.     SetRect(&rct, l-BOXOVERLAP, t-BOXOVERLAP, r, b);
  148.     EraseRect(&rct);
  149.     ForeColor(whiteColor);
  150.     DrawString(about);
  151.  
  152.     while (!Button()) {};
  153.     FlushEvents(everyEvent, 0);
  154.     DisposeWindow(w);
  155. }
  156.